<?php

class Doctrine_Model_PersonaDoctrineDao {

    public function getEntityManager() {
        if (Zend_Registry::isRegistered('em')) {
            return Zend_Registry::get('em');
        }
        return null;
    }

    public function obtenerTodos() {
        return $this->getEntityManager()
                ->createQuery('select p from Doctrine_Model_Entities_Persona p')
                ->getResult();
    }

    public function todosSinEscalafon() {

        return $this->getEntityManager()
                ->createQuery('select p from Doctrine_Model_Entities_Persona p JOIN p.datosLaborales dl where dl.escalafon is NULL')
                ->getResult();

//        $rsm = new ResultSetMapping;
//$rsm->addEntityResult('Persona', 'p');
//$rsm->addFieldResult('p', 'id', 'id');
//$rsm->addFieldResult('p', 'nombre', 'nombre');
//$rsm->addFieldResult('p', 'apellido', 'apellido');
//
//$rsm->addJoinedEntityResult('DatosLaborales' , 'dl', 'p', 'datosLaborales');
//$rsm->addFieldResult('dl', 'legajo', 'id');
//$rsm->addFieldResult('a', 'street', 'street');
//$rsm->addFieldResult('a', 'city', 'city');
//
//$sql = 'SELECT u.id, u.name, a.id AS address_id, a.street, a.city FROM users u ' .
//       'INNER JOIN address a ON u.address_id = a.id WHERE u.name = ?';
//$query = $this->_em->createNativeQuery($sql, $rsm);
//$query->setParameter(1, 'romanb');
//
//$users = $query->getResult();
    }


        public function todosSinOrigen() {

        return $this->getEntityManager()
                ->createQuery('select p from Doctrine_Model_Entities_Persona p JOIN p.datosLaborales dl where dl.origen is NULL')
                ->getResult();

    }

  public function todosSinDestino() {

        return $this->getEntityManager()
                ->createQuery('select p from Doctrine_Model_Entities_Persona p JOIN p.datosLaborales dl where dl.destino is NULL')
                ->getResult();

    }

      public function todosConOrigen() {

        return $this->getEntityManager()
                ->createQuery('select p from Doctrine_Model_Entities_Persona p JOIN p.datosLaborales dl where dl.origen is not NULL and  dl.origen <> 0')
                ->getResult();

    }

     public function todosSinOrigenDestino() {

        return $this->getEntityManager()
                ->createQuery('select p from Doctrine_Model_Entities_Persona p JOIN p.datosLaborales dl where dl.origen is NULL and  dl.destino is NULL')
                ->getResult();

    }

     public function todosActivos() {

        return $this->getEntityManager()
                ->createQuery('select p from Doctrine_Model_Entities_Persona p JOIN p.datosLaborales dl where dl.estado=5 and p.borrado=\'N\' ')
                ->getResult();

    }


    public function obtenerPorId($id) {
        return $this->getEntityManager()->find('Doctrine_Model_Entities_Persona', $id);
    }

    public function existePersona($dni, $sexo) {
        $personas = $this->buscarPorDniySexo($dni, $sexo);
        return ($personas->count() > 0);
    }

    public function guardar(Doctrine_Model_Entities_Persona $persona) {
        try {
         //   $persona->setFechaModificacion(new \DateTime(date('Y-m-d H:i:s'))) ;
             
            $this->getEntityManager()->persist($persona);
            $this->getEntityManager()->flush();
            return true;
        } catch (Exception $e) {
            $logger = Zend_Registry::get('logger');
            $logger->log("Error:PersonaDao " . $e->getMessage(), Zend_Log::ERR);
            return false;
        }
    }

    public function eliminar(Doctrine_Model_Entities_Persona $persona) {
        try {
            $this->getEntityManager()->remove($persona);
            $this->getEntityManager()->flush();
        
            return true;
        } catch (Exception $e) {
            $logger = Zend_Registry::get('logger');
          
            $logger->log("Error: " . $e->getMessage(), Zend_Log::ERR);
            return false;
        }
    }

    public function toArray(Doctrine_Model_Entities_Persona $persona) {
        
        $datos['idPersona'] = $persona->getId();
        $datos['apellido'] = $persona->getApellido();
        $datos['nombre'] = $persona->getNombre();
        $datos['sexo'] = $persona->getSexo();
        $datos['tipo_documento_id'] = $persona->getTipoDocumento()->getId();
        $datos['nro_documento'] = $persona->getNroDocumento();
        $datos['cuil'] = $persona->getCuil();
        $datos['estado_civil_id'] = $persona->getEstadoCivil();
        $datos['fecha_nacimiento'] = Doctrine_Model_Utilidad::formatoFechaParaMostrar($persona->getFechaNacimiento());
        $datos['mail'] = $persona->getMail();
        $datos['borrado'] = $persona->getBorrado();
        $datos['path'] = $persona->getPath();
        if ($persona->getLocalidad()) {
            $datos['localidad_id'] = $persona->getLocalidad()->getId();
        }

        return $datos;
    }

    public function toArrayCollection($coleccion) {
        $arrayCollection = new \Doctrine\Common\Collections\ArrayCollection();

        if (is_array($coleccion)) {
            foreach ($coleccion as $objeto) {
                $arrayCollection->add($objeto);
            }
        } else {
            if ($coleccion != NULL) {
                $arrayCollection->add($coleccion);
            }
        }
        return $arrayCollection;
    }

    public function buscarPorDniySexo($dni, $sexo) {
        try {
            return $this->toArrayCollection($this->getEntityManager()->getRepository('Doctrine_Model_Entities_Persona')
                            ->findOneBy(array('nroDocumento' => $dni, 'sexo' => $sexo)));
        } catch (Exception $e) {
            $logger = Zend_Registry::get('logger');
            $logger->log("Error: " . $e->getMessage(), Zend_Log::ERR);
            return false;
        }
    }

    public function buscarPorApellidoyNombre($apellido, $nombre) {
//        $listado = $this->getEntityManager()->getRepository('Doctrine_Model_Entities_Persona')
//                        ->findBy(array('apellido' => $apellido, 'nombre' => $nombre));
        if (!empty($apellido) && !empty($nombre)) {
            $query = "select p from Doctrine_Model_Entities_Persona p WHERE p.apellido LIKE '%" . $apellido . "%' AND  p.nombre LIKE '%" . $nombre . "%' ";
        } else {
            if (!empty($apellido)) {
                $query = "select p from Doctrine_Model_Entities_Persona p WHERE p.apellido LIKE '%" . $apellido . "%'  ";
            } else {
                $query = "select p from Doctrine_Model_Entities_Persona p WHERE   p.nombre LIKE '%" . $nombre . "%' ";
            }
        }

        $listado = $this->getEntityManager()
                        ->createQuery($query)
                        ->getResult();
        return $this->toArrayCollection($listado);
    }

    /*
      public function buscarPorLegajo($legajo)
      {
      $listado=$this->getEntityManager()
      ->createQuery("SELECT dl.legajo,p FROM Doctrine_Model_Entities_DatosLaborales dl JOIN dl.persona p  WHERE  dl.legajo = '".$legajo."'")
      ->getResult();
      return $this->toArrayCollection($listado);

      }
     */

    public function pruebaNativoSql() {
        $rsm = new \Doctrine\ORM\Query\ResultSetMapping();
        $rsm->addScalarResult('antiguedad_anios', 'antiguedad_anios');

        $query = $this->getEntityManager()->createNativeQuery('SELECT (YEAR(CURRENT_DATE) - YEAR(fecha_ingreso)) - (RIGHT(CURRENT_DATE,5) < RIGHT(fecha_ingreso,5)) AS antiguedad_anios FROM Datos_laborales where persona_id=23', $rsm);


        var_dump($query->getResult());
    }

}

